-- w bazie danych business ...
USE business;
GO

-- jeli istnieje tabela ... 
IF OBJECT_ID('dbo.Audyt_bazy_DDL') IS NOT NULL
	DROP TABLE dbo.Audyt_bazy_DDL;  -- ... to jest usuwana
GO

-- tworzymy now tabel przechowujc informacje o operacjach DDL wykonywanych 
-- na bazie business
CREATE TABLE dbo.Audyt_bazy_DDL
(
	Id              INT NOT NULL PRIMARY KEY IDENTITY(1, 1),
	Czas            DATETIME NOT NULl,
	Typ_operacji    SYSNAME NOT NULL,
	Uzytkownik      SYSNAME NOT NULL,
	Nazwa_schematu  SYSNAME NOT NULL,
	Nazwa_obiektu   SYSNAME NOT NULL,
	Obiekt_docelowy SYSNAME,
	Dane_zdarzenia  XML NOT NULL  -- przechowywanie polecenia zdarzenia
);
GO

-- tworzony jest nowy trigger ...
CREATE TRIGGER trg_Audyt_bazy_DDL
ON DATABASE                   -- ... na poziomie bazy danych ...
FOR DDL_DATABASE_LEVEL_EVENTS -- ... uruchamiany podczas wykonywania operacji DDL
AS

DECLARE
	@dane_zdarzenia AS XML;

  -- przypisanie informacji o operacjach DDL do zmiennej
	SET @dane_zdarzenia = eventdata();
	
	-- wstawienie odpowiednich danych do tabeli z uyciem funkcji query
	INSERT INTO dbo.Audyt_bazy_DDL (
		Czas, Typ_operacji, Uzytkownik, Nazwa_schematu, 
		Nazwa_obiektu, Obiekt_docelowy, Dane_zdarzenia
		)
	VALUES (
		-- funkcja CAST powoduje rzutowanie zwracanej wartoci na odpowiedni typ
		-- dat trzeba rzytowa na tym acuchowy - VARCHAR
		CAST(@dane_zdarzenia.query('data(//PostTime)')   AS VARCHAR(23)),
		CAST(@dane_zdarzenia.query('data(//EventType)')  AS SYSNAME),
		CAST(@dane_zdarzenia.query('data(//LoginName)')  AS SYSNAME),
		CAST(@dane_zdarzenia.query('data(//SchemaName)') AS SYSNAME),
		CAST(@dane_zdarzenia.query('data(//ObjectName)') AS SYSNAME),
		CAST(@dane_zdarzenia.query('data(//TargetObjectName)') AS SYSNAME),
		@dane_zdarzenia  -- zapisanie zawartoci XML
	);
GO


DROP TRIGGER trg_primary_key;
GO

CREATE TABLE dbo.testowa
(
	kolumna INT
);
GO

CREATE VIEW dbo.v_testowa AS
SELECT * FROM dbo.testowa;
GO

DROP TABLE dbo.testowa;
GO

DROP VIEW dbo.v_testowa;
GO
